/*******************************************
  Jose Andres Lara Vecino

  Author       : $Author: cainlara@gmail.com $
  Last CheckIn : $Date: 2012-08-22 18:35:06 +0000 (Wed, 22 Aug 2012) $
  Revision     : $Revision: 100 $
*******************************************/

package generico;

import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.TableCellRenderer;

import utilidad.IPropiedades;

/**
 * Super clase para tabla que lista objetos.
 * <P>
 * Esta clase, es la super clase usada para 
 * implementar los componentes <code>gui</code> 
 * de los listados de objetos.
 * 
 * @author jose.lara 08.06.2012
 */
public abstract class GenericoTablaListado extends GenericoTabla {
    private static final long serialVersionUID = 1L;
    
    private List<GenericoAccion> acciones           = null;
    private GenericoNuevoAccion nuevoAccion         = null;
    private GenericoEditarAccion editarAccion       = null;
    private GenericoEliminarAccion eliminarAccion   = null;
    
    public GenericoTablaListado() {
        super();
    }

    @Override
    public List<GenericoAccion> getAcciones() {
        if(acciones == null) {
            acciones = new ArrayList<GenericoAccion>(); 
            acciones.add(getNuevoAccion());
            acciones.add(getEditarAccion());
            acciones.add(getEliminarAccion());
        }
        
        return acciones;
    }
    
    @SuppressWarnings("rawtypes")
    @Override
    protected abstract GenericoTablaModelo getModelo();
    
    @Override
    public abstract TableCellRenderer getCellRenderer(int row, int column);
    
    protected abstract void mostrarDialogoEditar(GenericoLlaveNombre objeto);
    
    protected abstract void eliminarObjetoSeleccionado();
    
    @Override
    protected void actualizarAcciones() {
        getEliminarAccion().setEnabled(getObjetoSeleccionado() != null);
        getEditarAccion().setEnabled(getObjetoSeleccionado() != null);
        firePropertyChange(IPropiedades.ACTUALIZAR_BARRA, false, true);
    }
    
    protected GenericoLlaveNombre getObjetoSeleccionado() {
        if(getSelectedRow() >= 0) {
            return (GenericoLlaveNombre) getModelo().getDatos().get(getSelectedRow());
        }
        
        return null;
    }
    
    protected GenericoNuevoAccion getNuevoAccion() {
        if(nuevoAccion == null) {
            nuevoAccion = new GenericoNuevoAccion() {
                private static final long serialVersionUID = -5239773885894567929L;
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    mostrarDialogoEditar(null);
                }
            };
        }
        
        return nuevoAccion;
    }
    
    protected GenericoEditarAccion getEditarAccion() {
        if(editarAccion == null) {
            editarAccion = new GenericoEditarAccion() {
                private static final long serialVersionUID = -5239773885894567929L;
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    mostrarDialogoEditar(getObjetoSeleccionado());
                }
            };
            
            editarAccion.setEnabled(false);
        }
        
        return editarAccion;
    }
    
    protected GenericoEliminarAccion getEliminarAccion() {
        if(eliminarAccion == null) {
            eliminarAccion = new GenericoEliminarAccion() {
                private static final long serialVersionUID = -5096153153063367295L;
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    eliminarObjetoSeleccionado();
                }
            };
            eliminarAccion.setEnabled(false);
        }
        
        return eliminarAccion;
    }
    
    public boolean tieneDatos() {
        return getModelo().getDatos() != null && !getModelo().getDatos().isEmpty();
    }
}